perm filename EDIT.N[V,VDS] blob sn#263333 filedate 1977-02-07 generic text, type T, neo UTF8
.TITLE EDIT

;DEFINED GLOBALS

.GLOBL EDIT,DEFPRO,SWITCH,DELETE,INSERT,SKIP,LAST,TERMIN,PRINT

;REQUIRED GLOBALS

.GLOBL TYPSTR,TYPERR,LINOUT,INSTR,PRTINT,GETINT,OUTBUF,INBUF
.GLOBL GETBLK,RELBLK,PUSARG,PACNME,PSTEP,EDSNUM,EDPROG,FUNTAB
.GLOBL MOTION,FSTSTP,EDITIN,TYPBIT,FUNPTR,FUNARG
.GLOBL NUMARG,STRING,NOPROG,EMTYPE


;REGISTER DEFINITIONS

R0	=%0
R1	=%1
R2	=%2
R3	=%3
R4	=%4
SG	=%5
SP	=%6
PC	=%7

;POINTERS TO VARIABLES KEEP ON THE STACK

PPTR	=4 	;PTR TO CURRENT PROGRAM SYMBOL BLOCK
SNUM	=2 	;CURRENT STEP NUMBER
OPTR	=0	;PTR TO PREVIOUS STEP BLOCK

PPTR2	=26	;POINTERS USED BY EDIT FUNCTIONS
SNUM2	=24
OPTR2	=22
;"EDIT"   - COMMAND INSTRUCTION
 
;THIS COMMAND IS USED FOR MODIFYING EXISTING MOTION INSTRUCTION
;STEPS.  THE REQUIRED ARGUMENTS FOR THIS ROUTINE ARE THE NAME
;OF THE MOTION PROGRAM TO BE EDITED AND THE INSTRUCTION LINE
;NUMBER TO BEGIN WORK.  IF THE PROGRAM NAME IS OMITTED, THE
;PREVIOUS PROGRAM NAME IS USED.  IF IN ADDITION, THE LINE NUMBER
;IS OMITTED, EDITING WILL PICK UP FROM THE POINT WHERE EDITING
;WAS LAST TERMINATED.

;REGISTERS USED:
;
;	ALL REGISTERS ARE AVAILABLE FOR USE

EDIT:	SUB	#6,SP		;MAKE ROOM FOR PROG/STEP INFO
	MOV	@#EDSNUM,R3	;PREVIOUS STEP NUMBER
	MOV	10(SP),R0	;PICK UP PROGRAM NAME
	BNE	EDIT1
	MOV	@#EDPROG,R0	;USE SAME PROGRAM AS LAST TIME
	BNE	EDIT2
	MOV	#NOPROG,R1	;SIGNAL ERROR IF NOT DEFINED
	JSR	PC,TYPERR
	BR	EDTEXX
EDIT1:	MOV	#1,R3		;DEFAULT STEP = 1
EDIT2:	MOV	12(SP),R2	;PICK UP LINE NUMBER
	BGT	EDIT3
	MOV	R3,R2		;USE DEFAULT OR OLD VALUE

;SWITCH START EXECUTION FROM HERE

EDIT3:	MOV	#EDTME2,SG	;TYPE PROGRAM NAME
	JSR	PC,PACNME
	MOV	#EDTMES,SG
	JSR	PC,LINOUT
	MOV	R0,PPTR(SP)	;INITIALIZE PROG/STEP INFO
	ADD	#FSTSTP,R0
	MOV	R0,OPTR(SP)
	MOV	#1,SNUM(SP)
	DEC	R2		;ADVANCE TO PROPER STEP NUMBER
	BNE	MVEDWN
EDITLP:	MOV	SNUM(SP),R0	;PRINT THE CURRENT MOTION INST.
	MOV	@OPTR(SP),R1
	JSR	PC,PSTEP
	MOV	#OUTBUF,SG	;STEP NUMBER STILL IN OUTBUF
	MOVB	#77,OUTBUF+7 	;+ ?
	CLRB	OUTBUF+10
	JSR	PC,TYPSTR	;TYPE STEP NUMBER ?
	MOV	#INBUF,SG	;READ IN A RESPONSE
	JSR	PC,INSTR
	MOV	#FUNTAB,R0	;DECODE RESPONSE
	MOV	#EMTYPE,R1	;CAN BE EDIT OR MOTION INST
	JSR	PC,PUSARG
	BCC	EDIT4		;BRANCH IF DECODED PROPERLY
	TST	R1
	BEQ	NXTLNE		;GO TO NEXT LINE IF C/R TYPED
	JSR	PC,TYPERR	;ELSE INPUT ERROR
	BR	EDITLP
EDIT4:	CMPB	#EDITIN,TYPBIT(R0)	;EDIT INSTRUCTION?
	BNE	EDIT5
        JSR	PC,@FUNPTR(R0)	;EXECUTE EDIT FUNCTION
	ADD	#20,SP		;CLEAR ARGUMENT LIST
	BR	EDITLP
EDIT5:	MOV	R0,-(SP)	;SAVE NEW MOTION INST PTR
	MOV	@OPTR2(SP),R0	;PTR TO OLD MOTION INSTRUCTION
	BEQ	EDIT6
	MOV	(R0),@OPTR2(SP)	;DELETE OLD INSTRUCTION STEP
	JSR	PC,RELBLK
EDIT6:	MOV	(SP)+,R0	;CREATE NEW INSTRUCTION BLOCK
	JSR	PC,FILLI
	ADD	#20,SP		;CLEAR ARGUMENT LIST
	BR	EDITLP
NXTLNE:	MOV	#1,R2		;MOVE TO NEXT LINE
MVEDWN:	TST	@OPTR(SP)	;END OF PROGRAM?
	BEQ	EDITLP		;YES
	MOV	@OPTR(SP),OPTR(SP)	;NO, MOVE TO NEXT STEP
	INC	SNUM(SP)
	SOB	R2,MVEDWN
	BR	EDITLP

TERMIN:	ADD	#22,SP		;CLEAR SUBR. ARGUMENTS
EDTDNE:	MOV	PPTR(SP),@#EDPROG	;SAVE PROGRAM AND STEP NUMBER
	MOV	SNUM(SP),@#EDSNUM
EDTEXX:	ADD	#6,SP
       	RTS	PC

EDTMES:	.ASCII	/EDITING USER PROGRAM /
EDTME2:	.ASCII	/         /
	.EVEN

;END OF "EDIT"
;"DEFPRO" - COMMAND INSTRUCTION
 
;THIS COMMAND IS USED FOR READING IN A MOTION PROGRAM THAT HAS
;BEEN DUMPED OUT.  IT REQUIRES AS ITS ONLY ARGUMENT A POINTER
;TO A USER PROGRAM SYMBOL BLOCK.  IF THE USER PROGRAM ALREADY
;HAS SOME STEPS DEFINED,  AFTER CONFIRMATION, ALL EXISTING STEPS
;ARE DELETED BEFORE THE NEW PROGRAM IS READ.

;REGISTERS USED:
;
;	ALL REGISTERS ARE AVAILABLE FOR USE

DEFPRO:	MOV	2(SP),R3	;PICK UP PROGRAM NAME
	MOV	R3,-(SP)	;INITIALIZE PROG/STEP INFO
	MOV	#1,-(SP)
	ADD	#FSTSTP,R3
	MOV	R3,-(SP)
	TST	(R3)		;PROGRAM STEPS ALREADY DEFINED?
	BEQ	DEFPR1		;NO
	BR	DEFDL2		;DELETE ALL EXISTING STEPS
DEFDL1:	MOV	R3,R0
	JSR	PC,RELBLK
DEFDL2:	MOV	(R3),R3		;DELETE ONE STEP
	BNE	DEFDL1		;END OF PROGRAM?
	CLR	@OPTR(SP)
DEFPR1:	MOV	#INBUF,SG	;READ IN A STEP
	JSR	PC,INSTR
	JSR	PC,GETINT	;STRIP OFF LINE NUMBER
	BCC	DEFPR2
	TST	R1
	BNE	DEFPER
DEFPR2:	MOV	#FUNTAB,R0	;DECODE RESPONSE
	MOV	#MOTION,R1	;MOTION INSTRUCTION?
	JSR	PC,PUSARG
	BCS	DEFPR3		;BRANCH IF DECODED IMPROPERLY
	JSR	PC,FILLI
	ADD	#20,SP		;CLEAR ARGUMENT LIST
	BR	DEFPR1
DEFPR3:	TST	R1
	BEQ	DEFPDN		;EMPTY LINE MARKS END
DEFPER:	JSR	PC,TYPERR	;TYPE ERROR MESSAGE
DEFPDN:	ADD	#6,SP		;CLEAR STACK
       	RTS	PC


;END OF "DEFPRO"
;"SWITCH" - EDIT INSTRUCTION

;THIS FUNCTION SWITCHES THE USER PROGRAM BEING EDITED.  IT REQUIRES A
;POINTER TO THE SYMBOL BLOCK FOR THE NEW USER PROGRAM AND AN OPTIONAL
;STARTING LINE NUMBER.

;REGISTERS USED:
;
;	R0,R1,R2,R3 ARE GARBAGED

SWITCH:	MOV	2(SP),R0	;NEW PROGRAM
	MOV	4(SP),R2	;STARTING LINE NUMBER
	BGT	.+6
	MOV	#1,R2		;DEFAULT = STEP 1
	ADD	#22,SP		;CLEAR ARGS AND RET. ADDR
	JMP	EDIT3		;RESTART EDIT PROGRAM

;END OF "SWITCH"
;"DELETE" - EDIT INSTRUCTION

;THIS FUNCTIONS DELETES AN ARBITRARY NUMBER OF MOTION INSTRUCTIONS
;STARTING WITH THE CURRENT LINE.  IT REQUIRES AS ITS ONLY ARGUMENT A
;COUNT OF THE NUMBER OF LINES TO DELETE. IF THE COUNT IS NEGATIVE,
;NO DELETING IS DONE.

;REGISTERS USED:
;
;	R0,R1,R2,R3 ARE GARBAGED

DELETE:	MOV	2(SP),R2	;NUMBER OF STEPS TO DELETE
	BLT	DELTXX		;EXIT IF # < 0
	BNE	.+6
	MOV	#1,R2		;DEFAULT IS ONE STEP
	MOV	@OPTR2(SP),R3	;PTR TO CURRENT STEP
DELE1:	MOV	R3,R0		
      	BEQ	DELTDN		;ALL DONE IF END OF PROG
	MOV	(R3),R3		;DELETE ONE STEP
	JSR	PC,RELBLK
	SOB	R2,DELE1	;REPEAT TILL DONE
DELTDN:	MOV	R3,@OPTR2(SP)	;SAVE NEW CURRENT STEP
DELTXX:	RTS	PC


;END OF "DELETE"
;"INSERT" - EDIT INSTRUCTION

;THIS EDIT FUNCTION ALLOWS THE USER TO INSERT AN ARBITRARY NUMBER OF
;NEW MOTION INSTRUCTIONS IN BETWEEN EXISTING INSTRUCTIONS.  NO
;ARGUMENTS ARE REQUIRED BY THIS ROUTINE OTHER THAN THE POINTERS SET
;UP ON THE STACK BY "EDIT".  THIS MODE IS TERMINATED BY TYPING ANY
;ILLEGAL MOTION INSTRUCTION OR AN EMPTY LINE.

;REGISTERS USED:
;
;	R0,R1 GARBAGED

INSERT:	MOV	SNUM2(SP),-(SP)	;COPY CURRENT LINE # AND PTR
	MOV	SNUM2(SP),-(SP)
INSTLP:	MOV	#OUTBUF,SG	;TYPE THE CURRENT LINE NUMBER AND ?
	MOV	SNUM(SP),R0	;STEP NUMBER
	JSR	PC,PRTINT
	MOVB	#77,(SG)+	;"?"
	CLRB	(SG)
	MOV	#OUTBUF,SG
	JSR	PC,TYPSTR
	MOV	#INBUF,SG	;READ IN A MOTION INSTRUCTION
	JSR	PC,INSTR
	MOV	#FUNTAB,R0	;DECODE RESPONSE
	MOV	#MOTION,R1	;MOTION INSTRUCTION?
	JSR	PC,PUSARG
	BCS	INSRDN 		;BRANCH IF NOT
	JSR	PC,FILLI	;INSERT THE NEW INSTRUCTION
	ADD	#20,SP		;CLEAR ARGS
	BR	INSTLP
INSRDN:	TST	R1		;EMPTY LINE?
	BEQ	.+6
	JSR	PC,TYPERR	;NO, INPUT ERROR OCCURRED
	MOV	(SP)+,SNUM2(SP)	;SAVE NEW CURRENT LINE # AND PTR
	MOV	(SP)+,SNUM2(SP)
	RTS	PC

;END OF "INSERT"
;"PRINT" - EDIT INSTRUCTION

;THIS EDIT FUNCTION PRINTS OUT AN ARBITRARY NUMBER OF STEPS OF A
;USER MOTION PROGRAM.  IT REQUIRES AS ITS ONLY ARGUMENT A COUNT
;OF THE NUMBER OF STEPS TO BE PRINTED.  AFTER EXECUTION, THE 
;CURRENT LINE POINTER IS LEFT POINTING AT THE LAST STEP PRINTED.

;REGISTERS USED:
;
;	R0,R1,R2 GARBAGED

PRINT:	MOV	2(SP),R2	;NUMBER OF LINES TO PRINT
	BLT	PRNTDN		;NOTHING TO DO IF COUNT < 0
	BNE	.+6
	MOV	#1,R2		;DEFAULT IS PRINT 1 STEP
	BR	PRNSTR
PRNTLP:	MOV	SNUM2(SP),R0	;ELSE PRINT THE STEP
	JSR	PC,PSTEP
PRNSTR:	MOV	@OPTR2(SP),R1	;AT LAST STEP?
	BEQ	PRNTDN		;CANT MOVE PAST LAST STEP
	MOV	R1,OPTR2(SP)	;ELSE MOVE ON TO NEXT STEP
	INC	SNUM2(SP)
	MOV	(R1),R1		;IS THIS THE LAST STEP?
	BEQ	PRNTDN		;YES
	SOB	R2,PRNTLP	;PRINTED ALL REQUESTED STEPS?
PRNTDN:	RTS	PC
	

;END OF "PRINT"
;"SKIP"&"LAST" - EDIT INSTRUCTIONS

;THE FOLLOWING EDIT FUNCTIONS ARE USED FOR MOVING THE CURRENT LINE
;POINTER FORWARD AND BACKWARD THROUGH THE USER PROGRAM.  "LAST"
;DECREMENTS THE MOTION STEP POINTER AND REQUIRES NO ARGUMENT.  "SKIP"
;MOVES THE CURRENT LINE POINTER TO AN ARBITRARY STEP NUMBER.  "SKIP"
;REQUIRES AS ITS ONLY ARGUMENT, A LINE NUMBER.  BOT ROUTINES
;MODIFY THE "EDIT" POINTERS ON THE STACK.

;REGISTERS USED:
;
;	R0,R1,R2 GARBAGED

LAST:	MOV	#-1,R2		;MOVE STEP POINTER BACK ONE
	BR	MOVBCK

SKIP:	MOV	2(SP),R2	;GET NUMBER OF STEPS TO SKIP
	SUB	SNUM2(SP),R2
	BEQ	SKIPDN		;NOTHING TO DO IF ZERO
	BGT	FORWRD
MOVBCK:	MOV	PPTR2(SP),R0	;MOVING BACK, STEP FROM 0
	ADD	#FSTSTP,R0
	MOV	R0,OPTR2(SP)
	ADD	SNUM2(SP),R2	;NOW HOW MANY STEPS FORWARD?
	MOV	#1,SNUM2(SP)
	DEC	R2
	BLE	SKIPDN		;CANT BACK UP PAST STEP 1
FORWRD:	TST	@OPTR2(SP)	;CANT MOVE PAST LAST STEP
	BEQ	SKIPDN
	MOV	@OPTR2(SP),OPTR2(SP)	;MOVE DOWN A STEP
	INC	SNUM2(SP)
	SOB	R2,FORWRD
SKIPDN:	RTS	PC

;END OF "LAST"&"SKIP"
;"FILLI"  - EDIT SUBROUTINE

;INSERTS A MOTION INSTRUCTION BETWEEN THE LAST AND THE CURRENT STEPS.
;A POINTER TO THE MOTION INSTRUCTION SYMBOL BLOCK IS ASSUMED TO BE IN
;R0 AND THE ARGUMENTS ARE ASSUMED TO BE ON THE STACK.  A SAMPLE
;CALLING SEQUENCE FOLLOWS:
;
;			MOV	#MOTIONBLK,R0
;			JSR	PC,FILLI
;
;AFTER EXECUTION, THE "EDIT" POINTERS ON THE STACK ARE UPDATED TO
;POINT TO THE INSTRUCTION FOLLOWING THE NEW INSERTED STEP.

;REGISTERS USED:
;	R0,R1,R2,R3,R4 GARBAGED

FILLI:	MOV	R0,R2		;SAVE PTR TO MOTION SYM. BLK
	MOV	SP,R3		;PTR TO ARGUMENTS
	TST	(R3)+
	MOVB	NUMARG(R0),R4	;NUMBER OF ARGUMENTS
	BEQ	SAVINS
	CMP	#STRING,FUNARG(R2)	;1 STRING ARG?
	BNE	SAVINS		;BRANCH IF NOT
	MOV	2(SP),R3	;COUNT THE NUMBER OF CHARS IN STG
CNTCHR:	INC	R4
	CMPB	#15,(R3)+
	BNE	CNTCHR
	CLRB	-(R3)		;END STRING WITH 0 INSTEAD OF CR
	ASR	R4		;CONVERT TO WORD COUNT
	MOV	2(SP),R3	;START SAVING FROM HERE
SAVINS:	MOV	R4,R0		;# OF WORDS IN INST. BLOCK
	ADD	#2,R0
	JSR	PC,GETBLK	;GET SOME STORAGE SPACE
	BCS	FILDNE		;EXIT IF NONE LEFT
	MOV	@OPTR2(SP),(R0)	;LINK IN NEW STEP
	MOV	R0,@OPTR2(SP)
	MOV	R0,OPTR2(SP)
	INC	SNUM2(SP)	;INDICATE ONE MORE STEP
	TST	(R0)+
	MOV	R2,(R0)+	;SET PTR TO MOTION INST. BLK
	ASL	R4		;ANY ARGUMENTS?
	BEQ	FILDNE
	MOVB	(R3)+,(R0)+	;SAVE THE ARGUMENTS
	SOB	R4,.-2
	BR	FILDNE
	JSR	PC,TYPERR	;TYPE F.S. ERROR MESSAGE
FILDNE:	RTS	PC

.END
β